contents
Kafka의 개념, 아키텍처, 주요 컴포넌트, 작동 방식, 특징, 그리고 활용 사례까지 간단하게 보겠습니다.
1. Apache Kafka란?
- Kafka는 분산형 스트리밍 플랫폼으로, 대규모의 실시간 데이터 피드를 고속, 고가용성, 내결함성 있게 처리하도록 설계되었습니다.
- LinkedIn에서 개발되어 2011년에 오픈소스로 공개되었고, 현재는 대규모 데이터 처리와 이벤트 중심 아키텍처를 구축하는 데 널리 사용 중입니다.
2. Kafka의 주요 개념과 아키텍처
2.1. 토픽(Topic)
- 데이터가 흐르는 논리적 채널입니다.
- 생산자(Producer)가 메시지를 발행(publish)하는 대상이며, 소비자(Consumer)가 구독(subscribe)하여 데이터를 읽어갑니다.
- 토픽은 여러 개의 파티션(partition) 으로 나뉘어 병렬 처리와 확장이 가능하도록 설계되었습니다.
2.2. 파티션(Partition)
- 토픽을 물리적으로 나눈 단위로, 각 파티션은 메시지의 순서가 보장되는 불변의 로그(log) 형태입니다.
- 파티션 별로 메시지는 오프셋(offset) 이라는 고유 연속 번호를 가집니다.
- 파티션을 나눔으로써 다수의 소비자가 병렬로 데이터를 읽을 수 있습니다.
- 키가 동일한 메시지는 같은 파티션에 들어가 메시지 처리 순서가 보장됩니다.
2.3. 브로커(Broker)
- Kafka 서버 단위입니다.
- 다수의 브로커가 모여 하나의 Kafka 클러스터를 구성하며, 데이터 저장과 읽기/쓰기 요청을 처리합니다.
- 각 브로커는 특정 파티션의 리더(Leader) 혹은 팔로워(Follower) 역할을 맡습니다.
2.4. 복제(Replication)
- 파티션은 여러 브로커에 복제되어 데이터 내구성과 가용성을 보장합니다.
- 리더 브로커는 쓰기와 읽기 요청을 처리하고, 팔로워 브로커는 리더로부터 데이터를 복제합니다.
- 리더에 장애가 발생하면 팔로워 중 하나가 새로운 리더로 선출됩니다.
2.5. 프로듀서(Producer)
- 데이터를 토픽에 보내는 클라이언트 애플리케이션입니다.
- 특정 파티션에 데이터를 보내거나 키 기반으로 자동 할당할 수 있습니다.
- 메시지 직렬화, 로드 밸런싱 등의 기능을 수행합니다.
2.6. 컨슈머(Consumer)와 컨슈머 그룹(Consumer Group)
- 토픽에서 데이터를 읽는 클라이언트입니다.
- 컨슈머 그룹은 하나의 토픽 파티션 집합을 여러 소비자가 나누어 처리하므로 부하 분산과 확장성을 제공합니다.
- 각 컨슈머는 고유 파티션을 읽어 데이터 중복 처리를 방지합니다.
2.7. 오프셋(Offset)
- 파티션 내 메시지의 고유 순서 번호입니다.
- 소비자는 자신이 처리한 마지막 오프셋을 저장하고, 다음 읽을 위치를 추적합니다.
- 이를 통해 정확하며 중복 없는 데이터 소비가 가능합니다.
2.8. ZooKeeper
- 클러스터 관리와 구성을 담당하는 분산 코디네이터입니다.
- 브로커 메타데이터, 파티션 리더 선출, 클러스터 상태 관리를 수행하지만, 최근 Kafka에서는 ZooKeeper 대신 자체 메타데이터 관리 방식(KRaft)을 도입 중입니다.
3. Kafka 데이터 흐름 과정
- 프로듀서가 메시지를 특정 토픽에 보냅니다.
- 메시지는 토픽 내의 특정 파티션에 저장되고, 해당 파티션 로그의 끝에 순차적으로 붙습니다.
- 브로커는 메시지를 디스크에 영구 저장하며, 복제본도 다른 브로커에 기록됩니다.
- 컨슈머는 자신이 속한 컨슈머 그룹 내에서 각자 할당된 파티션의 메시지를 읽습니다.
- 컨슈머는 처리 완료 후 자신의 오프셋을 브로커에 커밋(commit)하여 처리 위치를 기록합니다.
4. Kafka의 특징 및 장점
- 높은 처리량(High Throughput): 초당 수십만, 수백만 건의 메시지 처리 가능.
- 저지연성(Low latency): 빠른 데이터 처리 및 전달.
- 확장성(Scalability): 파티션과 브로커 추가로 수평 확장 용이.
- 내결함성(Fault tolerance): 복제와 리더 선출로 장애 대응.
- 내구성(Durability): 디스크에 메시지를 영구 저장.
- 유연한 데이터 소비 모델: 다양한 컨슈머 그룹과 메시지 처리 패턴 지원.
- 배치 처리와 실시간 처리 모두 지원
5. Kafka 주요 API 종류
- Producer API: 데이터 생성 및 토픽으로 전송.
- Consumer API: 토픽 데이터 구독 및 처리.
- Streams API: 스트림 처리용, 데이터 변환 및 집계 등 실시간 스트림 연산 지원.
- Connector API: 외부 시스템과 Kafka 간 데이터 연동 자동화.
6. Kafka 활용 사례
- 로그 및 이벤트 수집 시스템
- 실시간 데이터 파이프라인 구축
- 메트릭 및 모니터링 데이터 처리
- 트랜잭션 처리 및 복잡한 이벤트 처리
- IoT 데이터 수집 및 분석
- 마이크로서비스 간 이벤트 기반 통신
7. Kafka를 사용해야 하는 경우
- 대용량 실시간 데이터 스트리밍 및 처리 필요할 때.
- 분산 환경에서 데이터의 신뢰성, 내구성이 요구될 때.
- 고성능 메시징과 이벤트 처리 인프라가 필요한 서비스.
- 수평 확장성과 복원력이 중요한 시스템 설계 시.
참고 구조 요약표
| 컴포넌트 | 설명 |
|---|---|
| Producer | 메시지를 토픽에 쓰는 주체 |
| Consumer | 토픽에서 메시지를 읽는 주체 |
| Broker | 메시지를 저장하고 클러스터 관리하는 서버 |
| Topic | 데이터 스트림을 논리적으로 구분하는 채널 |
| Partition | 토픽의 서브 단위, 병렬 처리 및 확장 가능 |
| Leader | 파티션별 읽기/쓰기 요청을 처리하는 브로커 |
| Follower | 리더의 데이터를 복제하는 브로커 |
| ZooKeeper | 클러스터 상태 및 리더 선출 관리 (KRaft 대체 중) |
Apache Kafka는 대규모 실시간 데이터 처리와 이벤트 기반 아키텍처를 위한 핵심 인프라로, 분산 시스템 설계와 데이터 스트리밍 분야에서 필수적인 도구입니다.
아래는 Apache Kafka와 RabbitMQ, ActiveMQ, Pulsar 같은 다른 메시징 시스템들의 차이점을 구조, 성능, 확장성, 사용 사례 등 여러 측면에서 비교한 내용입니다.
1. 메시징 모델
- Kafka
- 토픽과 파티션 기반의 퍼블리시/서브스크라이브 모델을 사용합니다.
- 분산형, 확장성 높은 스트리밍 데이터 처리에 적합하게 설계되었습니다.
- RabbitMQ와 ActiveMQ
- 기본 큐잉(포인트 투 포인트) 및 퍼블리시/서브스크라이브(토픽) 모델을 지원하며 JMS API와 호환이 뛰어납니다.
- 메시지 순서 보장과 신뢰성 높은 전달에 중점을 둡니다.
- Pulsar
- 퍼블리시/서브스크라이브와 큐 모델을 모두 지원합니다.
- 멀티테넌시와 스트림 분석에 강점이 있습니다.
2. 확장성
- Kafka
- 파티션 기반 수평 확장으로 방대한 데이터량과 높은 동시접속 처리에 최적화되어 있습니다.
- 메시지를 파티션별로 분산하여 브로커에 저장, 클러스터를 탄력적으로 확장 가능.
- RabbitMQ
- 클러스터링 및 페더레이션으로 확장하지만, Kafka만큼 초대용량 처리에 최적화되진 않았습니다.
- ActiveMQ
- 마스터/슬레이브 복제와 네트워크 브로커 구조로 기업 환경에 적합합니다.
- Pulsar
- 멀티테넌시를 지원하며 매우 높은 확장성을 보유합니다.
3. 성능 비교
| 처리량 & 지연시간 | 메시지 전달 방식 | |
|---|---|---|
| Kafka | 최고 처리량, 저지연 (스트리밍, 분석에 적합) | 최소 1회, 설정 시 정확히 1회 가능 |
| RabbitMQ | 신뢰성 높지만 중간 정도 처리량 | 최소 1회, 엄격한 순서 보장 |
| ActiveMQ | 배치 처리 시 높은 처리량, 지연변동 있음 | 최소 1회 |
| Pulsar | Kafka와 거의 비슷, 실시간 분석에 최적화 | 최소 1회, 완전한 엔드투엔드 내구성 |
4. 저장 및 내결함성
- Kafka
- 메시지를 디스크에 저장하며 구성 가능한 보존 기간에 따라 관리하는 로그 기반 저장.
- 복제 및 리더 선출로 높은 내결함성 보장.
- RabbitMQ
- 디스크 내구성 옵션 제공, 메모리 기반 큐도 가능.
- ActiveMQ
- 파일 기반, JDBC 기반 등 다양한 내구성 옵션.
- Pulsar
- 티어드 스토리지 및 로그 기반 저장 전략 사용.
5. 메시징 프로토콜
| 시스템 | 지원 프로토콜 |
|---|---|
| Kafka | TCP 위 바이너리 프로토콜 |
| RabbitMQ | AMQP, STOMP, MQTT 등 |
| ActiveMQ | OpenWire, AMQP, MQTT, STOMP 등 |
| Pulsar | 네이티브 프로토콜, WebSocket, HTTP API |
6. 컨슈머 모델
- Kafka와 Pulsar
- 컨슈머가 데이터를 직접 가져오는(Pull) 방식이며, 읽기 위치(오프셋) 제어 가능. 배치나 스트림 처리 모두 가능.
- RabbitMQ
- 브로커가 메시지를 푸시하는 방식으로 저지연.
- ActiveMQ
- 푸시와 풀 양쪽 모두 지원.
7. 생태계 및 통합
- Kafka
- 방대한 생태계(커넥터, 스트림 API, Flink, Storm 연동 등), 많은 툴과 연결 지원.
- RabbitMQ
- 풍부한 플러그인과 다양한 클라이언트 라이브러리.
- ActiveMQ
- Java EE 환경과 잘 어울리는 통합성.
- Pulsar
- 커넥터 증가 중, Pulsar Functions 통한 내장 스트림 처리 지원.
8. 최적 활용 사례
| 시스템 | 대표 사용 사례 |
|---|---|
| Kafka | 실시간 분석, 데이터 파이프라인, 이벤트 수집, 스트리밍 ETL, 마이크로서비스 간 통신 |
| RabbitMQ | 작업 큐, 트랜잭션 메시징, 신뢰성 요구 짧은 메시지 |
| ActiveMQ | 엔터프라이즈 통합, 레거시 Java/JMS 시스템, 미들웨어 |
| Pulsar | 대규모 스트림 분석, 실시간 대시보드, 멀티테넌시, 이벤트 기반 앱 |
9. 커뮤니티 및 성숙도
- Kafka: 크고 활발하며 대규모 프로덕션 적용 사례가 많음.
- RabbitMQ: 견고하며 사용자 친화적 커뮤니티 보유.
- ActiveMQ: 중소 규모 엔터프라이즈 지향 커뮤니티.
- Pulsar: 빠르게 성장하는 신흥 플랫폼.
요약 표
| 특징 | Kafka | RabbitMQ | ActiveMQ | Pulsar |
|---|---|---|---|---|
| 모델 | 퍼브/섭 스트리밍 | 큐, 퍼브/섭 | 큐, 퍼브/섭 | 퍼브/섭, 큐 |
| 확장성 | 최고 | 우수 | 우수 | 최고 |
| 성능 | 최고 | 중간 | 우수 | 최고 |
| 내구성 | 내구성 강함 | 내구성 있음 | 내구성 있음 | 내구성 강함 |
| 프로토콜 | TCP/바이너리 | AMQP/MQTT/STOMP | AMQP/MQTT/STOMP | 네이티브/WebSocket/HTTP |
| 생태계 | 가장 큼 | 풍부 | 보통 | 성장 중 |
| 적합한 용도 | 실시간, 빅데이터 | 신뢰성, 작업 큐 | 레거시 & 통합 | 스트리밍, 분석, 멀티테넌시 |
결론
Kafka는 초고속, 확장성 높은 실시간 데이터 스트리밍과 처리에 가장 적합합니다. RabbitMQ와 ActiveMQ는 신뢰성 높은 메시징과 전통적인 메시징 패턴에 강점을 가지며, Pulsar는 멀티테넌시와 고급 스트림 처리에 점점 각광받고 있습니다. 사용 목적과 시스템 요구 사항에 따라 적절한 선택이 중요합니다.
references